<?php
/*****************************************************
 *  描述: MCPHP 核心入口 参考了 heiyeluren 的MCPHP
 *  作者: fenghao 
 *  创建: 2012/02/21
 *  更新: 2013/01/15
 *****************************************************/

//判断版本
if (PHP_VERSION < '5.0.0'){
    die("MCPHP Error: Please use PHP Version >= 5.0");
}
//设置时区
if(PHP_VERSION > '5.1.0') {
	@date_default_timezone_set($arrConfig['Common']['TimeZone']);
}

if(!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}

if(!defined('MC_ROOT_DIR')){
    die("MCPHP Error: Please set MC_ROOT_DIR ");
}
if(!defined('MC_CORE_DIR')){
    die("MCPHP Error: Please set MC_CORE_DIR ");
}

//基础类目录
define("MC_LIB_DIR", MC_CORE_DIR . "/libs");
define("MC_EXT_DIR", MC_CORE_DIR . "/extra");

require MC_CORE_DIR.'/libs/global.func.php';

class MC_PHP{

    /**
     * @var object 对象单例
     */
    static $_instance = NULL;


    /**
     * 构造函数
     *
     * @param string $configFile 配置文件路径
     */
    private function __construct(){}

    /**
     * 保证对象不被clone
     */
    private function __clone() {}


    /**
     * 获取对象唯一实例
     *
     * @param string $configFile 配置文件路径
     * @return object 返回本对象实例
     */
    public static function getInstance(){
        if (!(self::$_instance instanceof self)){
            self::$_instance = new self();
        }
        return self::$_instance;
    }


    /**
     * 获取处理请求的URL路径 (SERVER_URI) 方式
     *
     * 
     * @param array 配置数组
     * @return array 返回parse好的数组
     */
    public static function parseUri($arrConfig){
        //判断是否支持rewrite
        $isRewrite = false;
        if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())){
            $isRewrite = true;
        }

        //解析URI
        $route = array();
		$appName				= $arrConfig['Framework']['AppName'];
        $controllerName			= $arrConfig['Framework']['ControllerName'];
        $actionName				= $arrConfig['Framework']['ActionName'];
		if(defined('ROOT_DIR') && defined('APPS_DIR')){
			$defaultApp			= str_replace(APPS_DIR."/", "", ROOT_DIR);
		}else{
	        $defaultApp				= $arrConfig['Framework']['DefaultApp'];		
		}
		//2013-01-16 更新
        //对于每个app的默认controller名称就是这个app的名称
		$defaultController		= $defaultApp;
        //$defaultController		= $arrConfig['Framework']['DefaultController'];
        $defaultAction			= $arrConfig['Framework']['DefaultAction'];
        $urlRewriteRule			= $arrConfig['Framework']['UrlRewrite'];

        $ServerUri    = explode("?", $_SERVER['REQUEST_URI']);
		
        $urlRewriteRule != '' ? preg_match($urlRewriteRule, $ServerUri[0], $module): 
                               $module = explode("/", $ServerUri[0]);
							   
        //支持URL打开和没打开的情况
		//2013-01-16 更新
		//对于每个app的默认controller名称就是这个app的名称
		//比如$appname = "foo"; 那么$defaultControllerName 也是 "foo"
        if (!$isRewrite || $ServerUri[0]=='/'){
			$route['AppName'] = isset($_GET[$appName])?htmlspecialchars($_GET[$appName]):$defaultApp;
			$route['ControllerName'] = isset($_GET[$controllerName])?htmlspecialchars($_GET[$controllerName]):$route['AppName'];
			$route['ActionName'] = isset($_GET[$actionName])?htmlspecialchars($_GET[$actionName]):$defaultAction;


//            $route['AppName'] = htmlspecialchars($_GET[$appName]);
//			$route['ControllerName'] = htmlspecialchars($_GET[$controllerName]);
//			$route['ActionName'] = htmlspecialchars($_GET[$actionName]);
//  
//			if($route['AppName'] == '')
//					$route['AppName'] = $defaultApp;
//			if($route['ControllerName'] == '')
//					$route['ControllerName'] = $route['AppName'];
//			if($route['ActionName'] == '')
//					$route['ActionName'] = $defaultAction;

            //$route['AppName'] = $_GET[$appName]=='' ? $defaultApp : $_GET[$appName];
            //$route['ControllerName'] = $_GET[$controllerName]=='' ? $route['AppName'] : $_GET[$controllerName];
            //$route['ActionName']     = $_GET[$actionName]=='' ? $defaultAction : $_GET[$actionName];    
        } else {
			//ToDO
			//有问题，要修正
            $route['AppName']        = isset($module[1])&&$module[1]!='' ? $module[1] : $defaultApp;
            $route['ControllerName'] = isset($module[2])&&$module[2]!='' ? $module[2] : $defaultController;
            $route['ActionName']     = isset($module[3])&&$module[3]!='' ? $module[3] : $defaultAction;
        }
		
		//fenghao 2013-03-28 
		//fix __get_config()提示无法取到Apps.name
		if(!defined("APP_NAME")){
			define("APP_NAME", $route['AppName']);
		}
		
        $route['param'] = isset($ServerUri[1]) ? $ServerUri[1] : '';
		
		//定义和应用相关的路径
		if(!defined('APPS_DIR')){
			define('APPS_DIR', MC_ROOT_DIR.'/apps');
		}
		if(!defined('ROOT_DIR')){
			define('ROOT_DIR', APPS_DIR.'/'.$route['AppName']);
		}
		
		//定义网站路径
		if(!defined('SITE_URL')){
			define('SITE_URL', str_replace((MC_ROOT_DIR.'/'), __get_config("Options.cn.URL"), ROOT_DIR));
			//define('SITE_DIR', str_replace((MC_ROOT_DIR.'/'), __get_config("Options.cn.URL"), ROOT_DIR));
			//echo MC_ROOT_DIR, "<p>", ROOT_DIR, "<p>",SITE_DIR;
			//exit();
		}

        return $route;
    }


    /**
     * 路由分发
     *
     */
    public function dispatch($configFile=''){
        //不进行魔术过滤
		if(PHP_VERSION > '5.3.0') {
			ini_set("magic_quotes_runtime", 0);
		}else{
        	set_magic_quotes_runtime(0);
		}

        try {
            //设置配置文件
			//加载默认的配置文件
            $config = MC_Config::factory(MC_ROOT_DIR.'/config.php');
            $arrConfig = $config->getData();

            if (!empty($arrConfig)){
                __save_config($arrConfig);
            }

            //读取控制器和action
            $route = self::parseUri($arrConfig);
			
			//var_dump($route);
			
			//fenghao 2013-01-15更新
			//应用路径
//			if(!defined('CONTROLLER_DIR')){
//				define("CONTROLLER_DIR", ROOT_DIR ."/controller");
//			}
//			if(!defined('MODEL_DIR')){
//				define("MODEL_DIR", ROOT_DIR ."/model");
//			}
//			if(!defined('VIEW_DIR')){
//				define("VIEW_DIR", ROOT_DIR ."/view");
//			}


            $controller = $route['ControllerName'] ."Controller";
            $action     = $route['ActionName'] ."Action";

			
            //包含控制器文件
//            $controllerFile = CONTROLLER_DIR. DS . $controller .".class.php";
//            if (!is_file($controllerFile) || !is_readable($controllerFile)){
//                throw new MC_Exception("controller file $controllerFile not exist or not readable");
//            }
//            require($controllerFile);
//            if (!class_exists($controller, false)){
//                throw new MC_Exception("controller class $controller  not exist");
//            }

			//判断 Action
//            $con = new $controller($arrConfig, $controller, $action);
//            if (!method_exists($con, $action)){
//                throw new MC_Exception("controller class method $controller->$action() not exist");
//            }



			//初始化app
			$app = new MC_App($route['AppName']);
			
			//暂时现将session的初始化加在这里
			//2013-03-17 修改，app中可能会重新设置session，所以在这里初始化session
            //MC_Session::sessionInit($arrConfig['Sess']['session_type']);
            //2013-03-20 更新 适应不同app对session的要求
			MC_Session::sessionInit(__get_config('Sess.session_type'));
			//session_start();
			
			//进行Action操作
			$app->$controller($action)->$action();

//            return $con->$action();

        } catch (MC_Exception $e){
			//echo __get_config('Apps.ShowType');
			if(__get_config('Apps.ShowType') == 'json'){
	            echo json_encode(array('error'=>-1, 'msg'=>$e->getMessage()));
			}else{
				if(function_exists('errorPage')){
					errorPage( $e->getMessage() );
				}else{
					echo $e->getMessage();
				}
			}
//            $e->redirect('http://www.google.com/','异常测试');
        }


    }

    

}
